import sys
import datetime

from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QBrush, QColor, QPainter
from PyQt5 import uic


class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0)))  # цвет
        painter.setPen(QColor(0, 0, 0))  # цвет
        painter.drawEllipse(self.x - 5, self.y - 5, 8, 8)  # отрисовка


class Point_default:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0)))  # цвет
        painter.setPen(QColor(0, 0, 0))  # цвет
        painter.drawEllipse(self.x - 5, self.y - 5, 8, 8)  # отрисовка


class Point_red:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(255, 0, 0)))
        painter.setPen(QColor(255, 0, 0))
        painter.drawEllipse(self.x - 5, self.y - 5, 8, 8)


class Point_blue:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 255)))
        painter.setPen(QColor(0, 0, 255))
        painter.drawEllipse(self.x - 5, self.y - 5, 8, 8)


class Point_pink:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(255, 0, 255)))
        painter.setPen(QColor(255, 0, 255))
        painter.drawEllipse(self.x - 5, self.y - 5, 8, 8)


class Point_yellow:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(255, 255, 0)))
        painter.setPen(QColor(255, 255, 0))
        painter.drawEllipse(self.x - 5, self.y - 5, 8, 8)


class Point_green:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 255, 0)))
        painter.setPen(QColor(0, 255, 0))
        painter.drawEllipse(self.x - 5, self.y - 5, 8, 8)


class Line:
    def __init__(self, xx, yy, zx, zy):
        self.xx = xx
        self.yy = yy
        self.zx = zx
        self.zy = zy

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0)))
        painter.setPen(QColor(0, 0, 0))
        painter.drawLine(self.xx, self.yy, self.zx, self.zy)


class Circle:
    def __init__(self, qx, qy, x, y):
        self.qx = qx
        self.qy = qy
        self.x = x
        self.y = y

    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0)))
        painter.setPen(QColor(0, 0, 0))
        '''Нохаждение радиуса по теореме Пифагора'''
        radius = int(((self.qx - self.x)**2 + (self.qy - self.y)**2)**0.5)
        painter.drawEllipse(self.qx - radius, self.qy - radius, 2 * radius,
                            2 * radius)


class Rubber:
    def __init__(self):
        self.update()


class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        uic.loadUi("Photarea.ui", self)

        self.TIME_NOW = datetime.datetime.today()  # фиксация времени

        '''Запись статистики в текстовый файл'''
        with open("STATS.txt", encoding="utf-8", mode="w") as FIRST:
            print(FIRST.write(f"Program start time: {self.TIME_NOW}"))

        '''запрещаем масштабирование окна'''
        self.setFixedSize(self.size())

        '''создание пустых переменных в дальнейшем для открытия оконо теории'''
        self.new_window_filter_1 = None
        self.new_window_filter_2 = None
        self.new_window_filter_3 = None
        self.new_window_filter_4 = None

        self.new_window_photo_1 = None
        self.new_window_photo_2 = None
        self.new_window_fhoto_3 = None

        self.label_5.setText("Welcome, amomymous!")
        '''привязываем функции к нажатию кнопок'''
        self.pushButton_3.clicked.connect(self.welcom)

        self.pushButton.clicked.connect(self.sepia)

        self.pushButton_2.clicked.connect(self.negative)

        self.pushButton_5.clicked.connect(self.contrast)

        self.pushButton_4.clicked.connect(self.black_and_white)

        self.pushButton_6.clicked.connect(self.shutter)

        self.pushButton_7.clicked.connect(self.diaphragm)

        self.pushButton_8.clicked.connect(self.megapixel)

        self.obj = list()
        self.instrument = "BRUSHER"
        '''привязываем кнопки ToolBar для изменения текущего инструмента
           рисования'''
        self.actionBrush.triggered.connect(self.settingBrush)
        self.actionLine.triggered.connect(self.settingLine)
        self.actionCircle.triggered.connect(self.settingCircle)
        self.actionRubber.triggered.connect(self.settingRubber)
        ''''''
        self.actionRed_2.triggered.connect(self.settingRedBrush)
        self.actionBlue.triggered.connect(self.settingBlueBrush)
        self.actionPink.triggered.connect(self.settingPinkBrush)
        self.actionDefault.triggered.connect(self.settingDefaultBrush)
        self.actionYellow.triggered.connect(self.settingYellowBrush)
        self.actionGreen.triggered.connect(self.settingGreenBrush)

    def paintEvent(self, event):  # Функция для отрисовки изображения
        painter = QPainter()
        painter.begin(self)  # начало отрисовки с объекта self
        for i in self.obj:  # для всех объектов
            i.draw(painter)  # мы говорим, что его нужно отрисовать на painter
        painter.end()  # фиксируем все изменения

    def mousePressEvent(self, event):
        if self.instrument == "BRUSHER":  # определение инструмента
            self.obj.append(Point(event.x(), event.y()))  # рисование на
        # координатах
        elif self.instrument == "REDBRUSH":  # определение инструмента
            self.obj.append(Point_red(event.x(), event.y()))
        elif self.instrument == "BLUEBRUSH":  # определение инструмента
            self.obj.append(Point_blue(event.x(), event.y()))
        elif self.instrument == "PINKBRUSH":  # определение инструмента
            self.obj.append(Point_pink(event.x(), event.y()))
        elif self.instrument == "DEFAULTBRUSH":  # определение инструмента
            self.obj.append(Point_default(event.x(), event.y()))
        elif self.instrument == "YELLOWBRUSH":  # определение инструмента
            self.obj.append(Point_yellow(event.x(), event.y()))
        elif self.instrument == "GREENBRUSH":  # определение инструмента
            self.obj.append(Point_green(event.x(), event.y()))
        #######
        elif self.instrument == "LINER":
            self.obj.append(Line(event.x(), event.y(), event.x(), event.y()))
        #######
        elif self.instrument == "CIRCLER":
            self.obj.append(Circle(event.x(), event.y(), event.x(), event.y()))
        #######
        elif self.instrument == "RUBBER":
            self.obj.clear()
        self.update()

    def mouseMoveEvent(self, event):  # отслеживание передвижения мыши
        # добавляем элементы отрисовки при изменение координат мыши с нажатой
        # кнопкой
        if self.instrument == "BRUSHER":
            self.obj.append(Point(event.x(), event.y()))
        elif self.instrument == "REDBRUSH":
            self.obj.append(Point_red(event.x(), event.y()))
        elif self.instrument == "BLUEBRUSH":
            self.obj.append(Point_blue(event.x(), event.y()))
        elif self.instrument == "PINKBRUSH":
            self.obj.append(Point_pink(event.x(), event.y()))
        elif self.instrument == "DEFAULTBRUSH":
            self.obj.append(Point_default(event.x(), event.y()))
        elif self.instrument == "YELLOWBRUSH":
            self.obj.append(Point_yellow(event.x(), event.y()))
        elif self.instrument == "GREENBRUSH":
            self.obj.append(Point_green(event.x(), event.y()))
        #######
        elif self.instrument == "LINER":
            # обращаемся к последнему элементу и переписываем x и y
            self.obj[-1].zx = event.x()
            self.obj[-1].zy = event.y()
        #######
        elif self.instrument == "CIRCLER":
            # обращаемся к последнему элементу и переписываем x и y
            self.obj[-1].x = event.x()
            self.obj[-1].y = event.y()
        #######
        elif self.instrument == "RUBBER":
            self.obj.clear()
        self.update()

    def settingBrush(self):  # функции обозначения инструментов
        self.instrument = "BRUSHER"

    def settingLine(self):  # функции обозначения инструментов
        self.instrument = "LINER"

    def settingCircle(self):  # функции обозначения инструментов
        self.instrument = "CIRCLER"

    def settingRubber(self):  # функции обозначения инструментов
        self.instrument = "RUBBER"

    def settingRedBrush(self):  # функции обозначения инструментов
        self.instrument = "REDBRUSH"

    def settingBlueBrush(self):  # функции обозначения инструментов
        self.instrument = "BLUEBRUSH"

    def settingPinkBrush(self):  # функции обозначения инструментов
        self.instrument = "PINKBRUSH"

    def settingDefaultBrush(self):  # функции обозначения инструментов
        self.instrument = "DEFAULTBRUSH"

    def settingYellowBrush(self):  # функции обозначения инструментов
        self.instrument = "YELLOWBRUSH"

    def settingGreenBrush(self):  # функции обозначения инструментов
        self.instrument = "GREENBRUSH"

    def welcom(self):  # функция рпеветствия
        Name = self.lineEdit.text()
        self.label_5.setText(f"Welcome, {Name}!")

    def sepia(self):  # функция открытия окна с теорией
        self.new_window_filter_1 = uic.loadUi("C:\\YANDEX\\other_ui\\sepia.ui")
        self.new_window_filter_1.setWindowTitle("Sepia")
        self.new_window_filter_1.show()

    def negative(self):  # функция открытия окна с теорией
        self.new_window_filter_2 = uic.loadUi(
            "C:\\YANDEX\\other_ui\\negative.ui")
        self.new_window_filter_2.setWindowTitle("Negative")
        self.new_window_filter_2.show()

    def contrast(self):  # функция открытия окна с теорией
        self.new_window_filter_3 = uic.loadUi(
            "C:\\YANDEX\\other_ui\\contrast.ui")
        self.new_window_filter_3.setWindowTitle("Contrast")
        self.new_window_filter_3.show()

    def black_and_white(self):  # функция открытия окна с теорией
        self.new_window_filter_4 = uic.loadUi(
            "C:\\YANDEX\\other_ui\\black_and_white.ui")
        self.new_window_filter_4.setWindowTitle("Black & White")
        self.new_window_filter_4.show()

    def shutter(self):  # функция открытия окна с теорией
        self.new_window_photo_1 = uic.loadUi(
            "C:\\YANDEX\\other_ui\\shutter.ui")
        self.new_window_photo_1.setWindowTitle("Shutter Speed")
        self.new_window_photo_1.show()

    def diaphragm(self):  # функция открытия окна с теорией
        self.new_window_photo_2 = uic.loadUi(
            "C:\\YANDEX\\other_ui\\diaphragm.ui")
        self.new_window_photo_2.setWindowTitle("Diaphragm")
        self.new_window_photo_2.show()

    def megapixel(self):  # функция открытия окна с теорией
        self.new_window_fhoto_3 = uic.loadUi(
            "C:\\YANDEX\\other_ui\\megapixel.ui")
        self.new_window_fhoto_3.setWindowTitle("Megapixel")
        self.new_window_fhoto_3.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Window()
    ex.show()
    sys.exit(app.exec())
